{-# OPTIONS -XRecursiveDo -XScopedTypeVariables #-}

module Main(main) where

import Control.Monad.Fix
import Data.Array.IO
import Control.Monad

norm a = mdo (_, sz) <- getBounds a
	     s <- ioaA 1 s sz 0
	     return ()
    where 
    	  ioaA i s sz acc
	   | i > sz = return acc
	   | True   = do v <- readArray a i
	                 writeArray a i (v / s)
		         ioaA (i+1) s sz $! (v + acc)

toList a = do (_, sz) <- getBounds a
	      mapM (\i -> readArray a i) [1..sz]

test    :: Int -> IO ()
test sz = do
	(arr :: IOArray Int Double) <- newArray (1, sz) 12
	putStrLn "Before: "
	toList arr >>= print 
	norm arr
	putStrLn "After: "
	lst <- toList arr 
	print lst
	putStrLn ("Normalized sum: " ++ show (sum lst))

main = test 10
